package modelo;

import interfaz.IEntidad;

import java.util.List;

import javax.swing.table.AbstractTableModel;

import manejador.ManejadorDeEmpleado;
import manejador.ManejadorDeRole;

import entidad.Empleado;
import entidad.Role;

public class ModeloEmpleado extends AbstractTableModel {

	private static final long serialVersionUID = 1L;
	private String[] encabezados = null;
	private List<IEntidad> empleados = null;
	private static ModeloEmpleado instancia = null;
	private Empleado empleado = null;
	private ManejadorDeEmpleado manejadorDeEmpleado = null;
	private String parametro = "ACTIVO";

	private ModeloEmpleado() {
		encabezados = new String[] { "ID Empleado", "Nombre", "Apellido",
				"Sexo", "Direccion", "Cedula", "Telefono", "Role", "Usuario",
				"Estatus" };
		manejadorDeEmpleado = ManejadorDeEmpleado.getInstancia();
		empleados = manejadorDeEmpleado.getEntidadDinamica(parametro);

	}

	public boolean validarUsuario(String usuario) {
		return manejadorDeEmpleado.validarUsuario(usuario);
	}

	public static ModeloEmpleado getInstancia() {
		if (instancia == null) {
			instancia = new ModeloEmpleado();
		}
		return instancia;
	}

	public String getColumnName(int indice) {
		return encabezados[indice];
	}

	@Override
	public int getColumnCount() {

		return encabezados.length;
	}

	@Override
	public int getRowCount() {

		return empleados.size();
	}

	@Override
	public Object getValueAt(int fila, int columna) {
		String retorno = "";
		empleado = (Empleado) manejadorDeEmpleado.getEntidadDinamica(
				this.getParametro()).get(fila);
		IEntidad role = ManejadorDeRole.getInstancia().getEntidadPorId(
				empleado.getIdRole());
		empleado.setRole(role);

		switch (columna) {
		case 0:
			retorno = String.valueOf(empleado.getIdEmpleado());
			break;
		case 1:
			retorno = empleado.getNombre();
			break;
		case 2:
			retorno = empleado.getApellido();
			break;
		case 3:
			retorno = empleado.getSexo();
			break;

		case 4:
			retorno = empleado.getDireccion();
			break;
		case 5:
			retorno = empleado.getCedula();
			break;
		case 6:
			retorno = empleado.getTelefono();
			break;
		case 7:
			retorno = ((Role) empleado.getRole()).getNombre();
			break;
		case 8:
			retorno = empleado.getUsuario();
			break;
		case 9:
			retorno = empleado.getEstatus();
			break;
		}
		return retorno;
	}

	public void agregar(Empleado empleado) {
		manejadorDeEmpleado.agregar(empleado);
		empleados = manejadorDeEmpleado.getEntidadDinamica(this.getParametro());
		fireTableDataChanged();
	}

	public void agregarEmpleadoConEmail(Empleado empleado) {
		manejadorDeEmpleado.agregarEmpleadoConEmail(empleado);
		empleados = manejadorDeEmpleado.getEntidadDinamica(this.getParametro());
		fireTableDataChanged();
	}
	
	public void agregarEmpleadoConCelular(Empleado empleado) {
		manejadorDeEmpleado.agregarEmpleadoConCelular(empleado);
		empleados = manejadorDeEmpleado.getEntidadDinamica(this.getParametro());
		fireTableDataChanged();
	}
	
	public void agregarEmpleadoConTodo(Empleado empleado) {
		manejadorDeEmpleado.agregarEmpleadoConTodo(empleado);
		empleados = manejadorDeEmpleado.getEntidadDinamica(this.getParametro());
		fireTableDataChanged();
	}
	
	public void modificar(Empleado empleado, int fila) {
		manejadorDeEmpleado.modificar(empleado, fila);
		empleados = manejadorDeEmpleado.getEntidadDinamica(this.getParametro());
		fireTableRowsDeleted(fila, fila);
		fireTableDataChanged();
	}

	public void actualizarTableParametros(String parametro) {
		this.setParametro(parametro);
		empleados = manejadorDeEmpleado.getEntidadDinamica(this.getParametro());
		fireTableDataChanged();
	}

	public void cambiarEstatus(int id) {
		manejadorDeEmpleado.cambiarEstatus(id);
		empleados = manejadorDeEmpleado.getEntidadDinamica(this.getParametro());
		fireTableDataChanged();
	}

	public String getParametro() {
		return parametro;
	}

	public void setParametro(String parametro) {
		this.parametro = parametro;
	}

}
